years <- seq(2014, 2019) 
#years <- seq(2014, 2020)
forprofit_counts <- profit_states_1419 %>% 
  dplyr::select(contains("count_Forprofit_")) %>% 
  summarize(across(everything(), sum, na.rm = TRUE))
Warning: There was 1 warning in `summarize()`.
ℹ In argument: `across(everything(), sum, na.rm = TRUE)`.
Caused by warning:
! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
Supply arguments directly to `.fns` through an anonymous function instead.

  # Previously
  across(a:b, mean, na.rm = TRUE)

  # Now
  across(a:b, \(x) mean(x, na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
nonprofit_counts <- profit_states_1419 %>% 
  dplyr::select(contains("count_Nonprofit_")) %>% 
  summarize(across(everything(), sum, na.rm = TRUE))

govt_counts <- profit_states_1419 %>% 
  dplyr::select(contains("count_Government_")) %>% 
  summarize(across(everything(), sum, na.rm = TRUE))


plot(years, forprofit_counts, type = 'l', main= "Treatment Facility Counts over time", ylim = c(1000, 8000), col = 'blue', xlab = 'Year', ylab = '# Treatment Centers')
lines(years, nonprofit_counts, type = 'l', main= "Non Profit Counts", col = 'red')
lines(years, govt_counts, type = 'l', main= "Government Counts", col = 'green')


legend("bottomleft", c("for profit", "non profit", "government"), col = c("blue", "red", "green"), pch ='-', lwd = 2)

library(ggplot2)
state_final_df %>%
  distinct(State_Name, year, .keep_all = TRUE) %>%
  group_by(year) %>%
  summarize(mean_drugusecalc = mean(druguse_calc),
            mean_aud = mean(aud_yr),
            mean_marijuana = mean(marijuana_month),
            mean_cocaine = mean(cocaine_yr),
            mean_heroin = mean(heroin_yr)) %>%
  mutate(prev_year= as.integer(year) - 1,
          year_range = paste(prev_year, "-", year)) %>%
   ungroup() %>%
   filter(year <= 2018) %>% #interested in only data until 2018
   ggplot(., aes(x = year_range, group = 1)) + 
   geom_line(aes(y = mean_cocaine, color = "Cocaine")) + 
   geom_line(aes(y = mean_heroin, color = "Heroin")) + 
   geom_line(aes(y = mean_aud, color = "Alcohol Use Disorder")) + 
   geom_line(aes(y=mean_marijuana, color = "Marijuana")) + 
   scale_color_manual(values = c("Cocaine" = "red", "Heroin" = "blue", "Alcohol Use Disorder" = "purple", "Marijuana" = "green")) +
   labs(y = "Average Prevalence in 50 States + DC", title = "NSDUH Alcohol Use Disorder and Drug Use Prevalence over Time")# + 

   #scale_x_discrete(labels = year_range)
  # #labs(y = "Average Prevalence in 50 States + DC", title = "NSDUH Alcohol Use Disorder and Marijuana Use Prevalence over Time")
  # #labs(y = "Average Prevalence in 50 States + DC", title = "NSDUH Cocaine and Heroin Use Prevalence over Time")
state_final_df %>%
  #distinct(State_Name, year, .keep_all = TRUE) %>%
  filter(year >= 2015) %>%
  group_by(year, profit_type) %>%
  summarize(num_centers = sum(count_tx, na.rm = TRUE)) %>%
  ungroup() %>%
  pivot_wider(id_cols = year, names_from = profit_type, values_from = num_centers) %>%
  ggplot(., aes(x = year, group = 1)) + 
  geom_line(aes(y = Forprofit, color = "For-Profit Centers")) + 
  geom_line(aes(y = Nonprofit, color = "Non-Profit Centers")) + 
  geom_line(aes(y = Government, color = "Government Centers")) + 
  scale_color_manual(values = c("For-Profit Centers" = "green", "Non-Profit Centers" = "blue", "Government Centers" = "red")) +
  labs(y = "Sum Treatment Centers in 50 States + DC", title = "Treatment Center Counts by Profit Status over Time")
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.

using map tutorial from: https://jtr13.github.io/cc19/different-ways-of-plotting-u-s-map-in-r.html#using-ggplot2-package state abbreviations from: https://www.ssa.gov/international/coc-docs/states.html

library(ggplot2)
library(maps)
library(mapdata)
library(plotly)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(sf)
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
usa <- map_data('usa')
state <- map_data("state")

#merge state geo file to the for-profit information
state <- state %>% 
              left_join(state_abbrevs_df, by = c("region" = "state_names")) %>% 
              left_join(profit_states_1419, by = c('state_abbrevs' = 'STATE')) 
                                      
#plot the number of for-profit treatment centers from 2015-2019
for (i in seq(2015, 2019))
{
  plot_forprofits <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Forprofit_", i, sep = "")), group=group)) + 
                      scale_fill_gradient(low = "grey", high = "green", limits = c(0,800)) +
                      geom_polygon(color = "white") + 
                      ggtitle(paste('# For-Profit Treatment Centers in', i)) + 
                      coord_fixed(1.3)
  print(plot_forprofits)
}



ggplot(data=state, aes(x=long, y=lat, fill= change_Forprofit_1519, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "green", limits = c(0,400)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Change in # For-Profit Treatment Centers from 2015 - 2019') + 
                      coord_fixed(1.3)

for (i in seq(2015, 2019))
{
  plot_nonprofits <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Nonprofit_", i, sep = "")), group=group)) + 
                      scale_fill_gradient(low = "grey", high = "blue", limits = c(0,900)) +
                      geom_polygon(color = "white") + 
                      ggtitle(paste('# Non-Profit Treatment Centers in', i)) + 
                      coord_fixed(1.3)
  print(plot_nonprofits)
}



ggplot(data=state, aes(x=long, y=lat, fill= change_Nonprofit_1519, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "blue", limits = c(0,100)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Change in # Non-Profit Treatment Centers from 2015 - 2019') + 
                      coord_fixed(1.3)

for (i in seq(2015, 2019))
{
  plot_govt <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Government_", i, sep = "")), group=group)) + 
                      scale_fill_gradient(low = "grey", high = "red", limits = c(0,250)) +
                      geom_polygon(color = "white") + 
                      ggtitle(paste('# Government Treatment Centers in', i)) + 
                      coord_fixed(1.3)
  print(plot_govt)
}




ggplot(data=state, aes(x=long, y=lat, fill= change_Government_1519, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "red", limits = c(0,50)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Change in # Government Treatment Centers from 2015 - 2019') + 
                      coord_fixed(1.3)


# state_name <- "California"
# 
# par(mar=c(5, 4, 4, 12), xpd=TRUE)
# 
# plot(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "UDPYILAL", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "UDPYILAL", ]$est_total, type = 'o', ylim= c(0,10000), main = paste(state, "Substance Use Measures Over Time") ,xlab = "year", ylab = "Thousands of People in 2015-18")
# 
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "ILLEMMON", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "ILLEMMON", ]$est_total, col = 'blue', type = 'o')
# 
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "BNGDRK", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "BNGDRK", ]$est_total, col = 'red', type = 'o')
# 
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "TXNPILAL", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "TXNPILAL", ]$est_total, col = 'green', type = 'o')
# 
# lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "PNRNMYR", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "PNRNMYR", ]$est_total, col = 'purple', type = 'o')
# 
# legend('topright',legend = c("Substance Use Disorder", "Drug use in past month", "Binge alcohol use", "Needing, not receiving tx", "pain reliever misuse"), col = c("black", "blue", "red", "green", "purple"), lty = 1,  inset=c(-0.5, 0))

plot(state_final_df[state_final_df$profit_type == "Forprofit", ]$sud, state_final_df[state_final_df$profit_type == "Forprofit",]$tx_percapita, xlab = "Substance Use Disorder Counts (in thousands)", ylab = "For profit treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Forprofit", ]))



plot(state_final_df[state_final_df$profit_type == "Nonprofit", ]$sud, state_final_df[state_final_df$profit_type == "Nonprofit",]$tx_percapita, col = "blue", xlab = "Substance Use Disorder counts (in thousands) ", ylab = "Nonprofit treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Nonprofit", ]))


plot(state_final_df[state_final_df$profit_type == "Government", ]$sud, state_final_df[state_final_df$profit_type == "Government",]$tx_percapita, col = "green", xlab = "Substance Use Disorder counts (in thousands)", ylab = "Government treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Government", ]))

NA
NA

Look at the distribution of each input variable of interest at each point in time


create_hist <- function(df, year_param, profit_param, col_param)
{
  subset_data <- df %>%
  filter(year == year_param, profit_type == profit_param)
  hist(subset_data[[col_param]], main = paste("Histogram of ",year_param, profit_param, col_param), xlab = col_param)
}

#substance use measures are roughly normal
create_hist(state_final_df, 2016, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2017, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2018, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2019, "Forprofit", "binge_drinking")


create_hist(state_final_df, 2016, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2017, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2018, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2019, "Forprofit", "illicit_druguse")


create_hist(state_final_df, 2016, "Forprofit", "needing_tx")

create_hist(state_final_df, 2017, "Forprofit", "needing_tx")

create_hist(state_final_df, 2018, "Forprofit", "needing_tx")

create_hist(state_final_df, 2019, "Forprofit", "needing_tx")


create_hist(state_final_df, 2016, "Forprofit", "sud")

create_hist(state_final_df, 2017, "Forprofit", "sud")

create_hist(state_final_df, 2018, "Forprofit", "sud")

create_hist(state_final_df, 2019, "Forprofit", "sud")

#for profit treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Forprofit", "count_tx")

create_hist(state_final_df, 2017, "Forprofit", "count_tx")

create_hist(state_final_df, 2018, "Forprofit", "count_tx")

create_hist(state_final_df, 2019, "Forprofit", "count_tx")

#non profit treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Nonprofit", "count_tx")

create_hist(state_final_df, 2017, "Nonprofit", "count_tx")

create_hist(state_final_df, 2018, "Nonprofit", "count_tx")

create_hist(state_final_df, 2019, "Nonprofit", "count_tx")

#government treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Government", "count_tx")

create_hist(state_final_df, 2017, "Government", "count_tx")

create_hist(state_final_df, 2018, "Government", "count_tx")

create_hist(state_final_df, 2019, "Government", "count_tx")

Investigating treatment centers per capita over time and by profit status

forprofit_txpercapita <- state_final_df %>% 
  filter(profit_type == "Forprofit") %>% 
  group_by(year) %>%
  summarize(avg_tx_percapita = mean(tx_percapita, na.rm = TRUE),
            min_tx_percapita = min(tx_percapita, na.rm = TRUE),
            max_tx_percapita = max(tx_percapita, na.rm = TRUE))
  
nonprofit_txpercapita <- state_final_df %>% 
  filter(profit_type == "Nonprofit") %>% 
  group_by(year) %>%
  summarize(avg_tx_percapita = mean(tx_percapita, na.rm = TRUE),
            min_tx_percapita = min(tx_percapita, na.rm = TRUE),
            max_tx_percapita = max(tx_percapita, na.rm = TRUE))

govt_txpercapita <- state_final_df %>% 
  filter(profit_type == "Government") %>% 
  group_by(year) %>%
  summarize(avg_tx_percapita = mean(tx_percapita, na.rm = TRUE),
            min_tx_percapita = min(tx_percapita, na.rm = TRUE),
            max_tx_percapita = max(tx_percapita, na.rm = TRUE))



plot(forprofit_txpercapita$year, forprofit_txpercapita$avg_tx_percapita, type = 'o', col = 'blue', ylim = c(0.000001, 0.00005))
#lines(forprofit_txpercapita$year, forprofit_txpercapita$min_tx_percapita, type = 'l', col = 'blue', lty = 2)
#lines(forprofit_txpercapita$year, forprofit_txpercapita$max_tx_percapita, type = 'l', col = 'blue', lty = 2)

lines(nonprofit_txpercapita$year, nonprofit_txpercapita$avg_tx_percapita, type = 'o', col = 'red' )
#lines(nonprofit_txpercapita$year, nonprofit_txpercapita$min_tx_percapita, type = 'l', col = 'red', lty = 2 )
#lines(nonprofit_txpercapita$year, nonprofit_txpercapita$max_tx_percapita, type = 'l', col = 'red', lty = 2 )

lines(govt_txpercapita$year, govt_txpercapita$avg_tx_percapita, type = 'o', col = 'green')

#lines(govt_txpercapita$year, govt_txpercapita$min_tx_percapita, type = 'l', col = 'green', lty = 2)
#lines(govt_txpercapita$year, govt_txpercapita$max_tx_percapita, type = 'l', col = 'green', lty = 2)
state_final_df[is.na(state_final_df$tx_percapita),]
#Connecticut, South Carolina, Ohio, Mississippi, New York have the fewest for-profit treatment centers per capita
#Maine, Idaho, Utah, North Dakota, Kentucky have the most for-profit treatment centers per capita 
state_final_df %>%
  group_by(State_Abbrev, profit_type) %>%
  summarize(avg_txpercapita = mean(tx_percapita, na.rm = TRUE)) %>%
  filter(profit_type == "Forprofit") %>%
  arrange(avg_txpercapita) %>%
  ungroup() %>%
  left_join(state, by = c("State_Abbrev" = "state_abbrevs")) %>%
ggplot(aes(x=long, y=lat, fill= avg_txpercapita, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "green", limits = c(0,0.0001)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Average Nonprofit Treatment Centers per capita 2015-2019') + 
                      coord_fixed(1.3)
`summarise()` has grouped output by 'State_Abbrev'. You can override using the `.groups` argument.

#Virginia, Texas, Idaho, South Carolina, Georgia have the fewest non-profit treatment centers per capita
#Hawaii, Alaska, Maine, Vermont, Wyoming have the most non-profit treatment centers per capita 
state_final_df %>%
  group_by(State_Abbrev, profit_type) %>%
  summarize(avg_txpercapita = mean(tx_percapita, na.rm = TRUE)) %>%
  filter(profit_type == "Nonprofit") %>%
  arrange(avg_txpercapita) %>%
  ungroup() %>%
  left_join(state, by = c("State_Abbrev" = "state_abbrevs")) %>%
ggplot(aes(x=long, y=lat, fill= avg_txpercapita, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "blue", limits = c(0,0.0001)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Average Nonprofit Treatment Centers per capita 2015-2019') + 
                      coord_fixed(1.3)
`summarise()` has grouped output by 'State_Abbrev'. You can override using the `.groups` argument.

#New Hampshire, Tennessee, Pennsylvania, Delaware, Kentucky have the fewest government treatment centers per capita
#Alaska, North Dakota, South Dakota, Wyoming, New Mexico have the most government treatment centers per capita 
state_final_df %>%
  group_by(State_Abbrev, profit_type) %>%
  summarize(avg_txpercapita = mean(tx_percapita, na.rm = TRUE)) %>%
  filter(profit_type == "Government") %>%
  arrange(avg_txpercapita) %>%
  ungroup() %>%
  left_join(state, by = c("State_Abbrev" = "state_abbrevs")) %>%
ggplot(aes(x=long, y=lat, fill= avg_txpercapita, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "red", limits = c(0,0.00005)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Average government Treatment Centers per capita 2015-2019') + 
                      coord_fixed(1.3)
`summarise()` has grouped output by 'State_Abbrev'. You can override using the `.groups` argument.

Create a csv with the averages per state between 2015 - 2019 and write to csv

state_final_df %>%
  filter(year >= 2015) %>% #model will only use 2015 - 2019
  group_by(State_Name, year) %>%
  pivot_wider(id_cols = c(State_Name, year), names_from = profit_type, values_from = count_tx) %>%
  ungroup() %>%
  arrange(year) %>%
  group_by(State_Name) %>%
  summarize(Forprofit_Count2015 = first(Forprofit),
            Forprofit_Change1519 = last(Forprofit) - first(Forprofit),
            Nonprofit_Count2015 = first(Nonprofit),
            Nonprofit_Change1519 = last(Nonprofit) - first(Nonprofit),
            Government_Count2015 = first(Government), 
            Government_Change1519 = last(Government) - first(Government)
) %>%
  arrange(desc(Forprofit_Change1519)) %>%
  write.csv("State_Profit_Counts.csv")
  #mutate(increase = ifelse())

Create a csv of the drug use by state

state_final_df %>%
  filter(year >= 2015) %>% #model will only use 2015 - 2019
  group_by(State_Name) %>%
  arrange(year) %>%
   summarize(Druguse2013_14 = first(prev2years_drugusecalc),
             Cocaine2013_14 = first(prev2years_cocaine),
             Heroin2013_14 = first(prev2years_heroin),
             AUD2013_14 = first(prev2years_aud),
             Marijuana2013_14 = first(prev2years_marijuana))%>%
#             Forprofit_Change1519 = last(Forprofit) - first(Forprofit),
#             Nonprofit_Count2015 = first(Nonprofit),
#             Nonprofit_Change1519 = last(Nonprofit) - first(Nonprofit),
#             Government_Count2015 = first(Government), 
#             Government_Change1519 = last(Government) - first(Government)
   arrange(desc(Druguse2013_14)) %>%
    write.csv("State_Druguse_Counts.csv")

state_yearly_averages<- state_final_df %>%
  distinct(State_Abbrev, profit_type, year, .keep_all = TRUE) %>%
  group_by(year) %>%
  summarize(avg_druguse = mean(illicit_druguse),
         avg_drinking = mean(binge_drinking),
         avg_od = mean(RATE)) %>%
  arrange(year)

plot(state_yearly_averages$year, state_yearly_averages$avg_druguse, type = 'l')

plot(state_yearly_averages$year, state_yearly_averages$avg_drinking, type = 'l')

plot(state_yearly_averages$avg_od, state_yearly_averages$avg_od, type = 'l')

state_final_df %>%
  select(State_Name, profit_type, year, count_tx, cocaine_yr, marijuana_month, aud_yr, heroin_yr, druguse_calc) %>%
  #group_by(State_Name, profit_type) #%>%
  pivot_wider(id_cols = c(State_Name, profit_type), names_from = year, values_from = count_tx, unused_fn = first) #%>%
  #mutate(average_1419 = mean(select("2014", "2015", "2016", "2017", "2018", "2019")))#%>%
  #pivot_wider(id_cols = c(State_Name, year), names_from = profit_type, values_from = count_tx, unused_fn = first) #%>%
  #pivot_wider(id_cols = c(State_Name), names_from = profit_type, values_from=c("2014", "2015", "2016", "2017", "2018", "2019"), unused_fn = first)
print("Test")
LS0tCnRpdGxlOiAiU0FNSFNBIE5TU0FUUyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KCnllYXJzIDwtIHNlcSgyMDE0LCAyMDE5KSAKI3llYXJzIDwtIHNlcSgyMDE0LCAyMDIwKQpmb3Jwcm9maXRfY291bnRzIDwtIHByb2ZpdF9zdGF0ZXNfMTQxOSAlPiUgCiAgZHBseXI6OnNlbGVjdChjb250YWlucygiY291bnRfRm9ycHJvZml0XyIpKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcyhldmVyeXRoaW5nKCksIHN1bSwgbmEucm0gPSBUUlVFKSkKCm5vbnByb2ZpdF9jb3VudHMgPC0gcHJvZml0X3N0YXRlc18xNDE5ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCJjb3VudF9Ob25wcm9maXRfIikpICU+JSAKICBzdW1tYXJpemUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgc3VtLCBuYS5ybSA9IFRSVUUpKQoKZ292dF9jb3VudHMgPC0gcHJvZml0X3N0YXRlc18xNDE5ICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvbnRhaW5zKCJjb3VudF9Hb3Zlcm5tZW50XyIpKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcyhldmVyeXRoaW5nKCksIHN1bSwgbmEucm0gPSBUUlVFKSkKCgpwbG90KHllYXJzLCBmb3Jwcm9maXRfY291bnRzLCB0eXBlID0gJ2wnLCBtYWluPSAiVHJlYXRtZW50IEZhY2lsaXR5IENvdW50cyBvdmVyIHRpbWUiLCB5bGltID0gYygxMDAwLCA4MDAwKSwgY29sID0gJ2JsdWUnLCB4bGFiID0gJ1llYXInLCB5bGFiID0gJyMgVHJlYXRtZW50IENlbnRlcnMnKQpsaW5lcyh5ZWFycywgbm9ucHJvZml0X2NvdW50cywgdHlwZSA9ICdsJywgbWFpbj0gIk5vbiBQcm9maXQgQ291bnRzIiwgY29sID0gJ3JlZCcpCmxpbmVzKHllYXJzLCBnb3Z0X2NvdW50cywgdHlwZSA9ICdsJywgbWFpbj0gIkdvdmVybm1lbnQgQ291bnRzIiwgY29sID0gJ2dyZWVuJykKCgpsZWdlbmQoImJvdHRvbWxlZnQiLCBjKCJmb3IgcHJvZml0IiwgIm5vbiBwcm9maXQiLCAiZ292ZXJubWVudCIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIpLCBwY2ggPSctJywgbHdkID0gMikKCmBgYApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpzdGF0ZV9maW5hbF9kZiAlPiUKICBkaXN0aW5jdChTdGF0ZV9OYW1lLCB5ZWFyLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpemUobWVhbl9kcnVndXNlY2FsYyA9IG1lYW4oZHJ1Z3VzZV9jYWxjKSwKICAgICAgICAgICAgbWVhbl9hdWQgPSBtZWFuKGF1ZF95ciksCiAgICAgICAgICAgIG1lYW5fbWFyaWp1YW5hID0gbWVhbihtYXJpanVhbmFfbW9udGgpLAogICAgICAgICAgICBtZWFuX2NvY2FpbmUgPSBtZWFuKGNvY2FpbmVfeXIpLAogICAgICAgICAgICBtZWFuX2hlcm9pbiA9IG1lYW4oaGVyb2luX3lyKSkgJT4lCiAgbXV0YXRlKHByZXZfeWVhcj0gYXMuaW50ZWdlcih5ZWFyKSAtIDEsCiAgICAgICAgICB5ZWFyX3JhbmdlID0gcGFzdGUocHJldl95ZWFyLCAiLSIsIHllYXIpKSAlPiUKICAgdW5ncm91cCgpICU+JQogICBmaWx0ZXIoeWVhciA8PSAyMDE4KSAlPiUgI2ludGVyZXN0ZWQgaW4gb25seSBkYXRhIHVudGlsIDIwMTgKICAgZ2dwbG90KC4sIGFlcyh4ID0geWVhcl9yYW5nZSwgZ3JvdXAgPSAxKSkgKyAKICAgZ2VvbV9saW5lKGFlcyh5ID0gbWVhbl9jb2NhaW5lLCBjb2xvciA9ICJDb2NhaW5lIikpICsgCiAgIGdlb21fbGluZShhZXMoeSA9IG1lYW5faGVyb2luLCBjb2xvciA9ICJIZXJvaW4iKSkgKyAKICAgZ2VvbV9saW5lKGFlcyh5ID0gbWVhbl9hdWQsIGNvbG9yID0gIkFsY29ob2wgVXNlIERpc29yZGVyIikpICsgCiAgIGdlb21fbGluZShhZXMoeT1tZWFuX21hcmlqdWFuYSwgY29sb3IgPSAiTWFyaWp1YW5hIikpICsgCiAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJDb2NhaW5lIiA9ICJyZWQiLCAiSGVyb2luIiA9ICJibHVlIiwgIkFsY29ob2wgVXNlIERpc29yZGVyIiA9ICJwdXJwbGUiLCAiTWFyaWp1YW5hIiA9ICJncmVlbiIpKSArCiAgIGxhYnMoeSA9ICJBdmVyYWdlIFByZXZhbGVuY2UgaW4gNTAgU3RhdGVzICsgREMiLCB0aXRsZSA9ICJOU0RVSCBBbGNvaG9sIFVzZSBEaXNvcmRlciBhbmQgRHJ1ZyBVc2UgUHJldmFsZW5jZSBvdmVyIFRpbWUiKSMgKyAKICAgI3NjYWxlX3hfZGlzY3JldGUobGFiZWxzID0geWVhcl9yYW5nZSkKICAjICNsYWJzKHkgPSAiQXZlcmFnZSBQcmV2YWxlbmNlIGluIDUwIFN0YXRlcyArIERDIiwgdGl0bGUgPSAiTlNEVUggQWxjb2hvbCBVc2UgRGlzb3JkZXIgYW5kIE1hcmlqdWFuYSBVc2UgUHJldmFsZW5jZSBvdmVyIFRpbWUiKQogICMgI2xhYnMoeSA9ICJBdmVyYWdlIFByZXZhbGVuY2UgaW4gNTAgU3RhdGVzICsgREMiLCB0aXRsZSA9ICJOU0RVSCBDb2NhaW5lIGFuZCBIZXJvaW4gVXNlIFByZXZhbGVuY2Ugb3ZlciBUaW1lIikKCmBgYAoKCmBgYHtyfQpzdGF0ZV9maW5hbF9kZiAlPiUKICAjZGlzdGluY3QoU3RhdGVfTmFtZSwgeWVhciwgLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgZmlsdGVyKHllYXIgPj0gMjAxNSkgJT4lCiAgZ3JvdXBfYnkoeWVhciwgcHJvZml0X3R5cGUpICU+JQogIHN1bW1hcml6ZShudW1fY2VudGVycyA9IHN1bShjb3VudF90eCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSB5ZWFyLCBuYW1lc19mcm9tID0gcHJvZml0X3R5cGUsIHZhbHVlc19mcm9tID0gbnVtX2NlbnRlcnMpICU+JQogIGdncGxvdCguLCBhZXMoeCA9IHllYXIsIGdyb3VwID0gMSkpICsgCiAgZ2VvbV9saW5lKGFlcyh5ID0gRm9ycHJvZml0LCBjb2xvciA9ICJGb3ItUHJvZml0IENlbnRlcnMiKSkgKyAKICBnZW9tX2xpbmUoYWVzKHkgPSBOb25wcm9maXQsIGNvbG9yID0gIk5vbi1Qcm9maXQgQ2VudGVycyIpKSArIAogIGdlb21fbGluZShhZXMoeSA9IEdvdmVybm1lbnQsIGNvbG9yID0gIkdvdmVybm1lbnQgQ2VudGVycyIpKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJGb3ItUHJvZml0IENlbnRlcnMiID0gImdyZWVuIiwgIk5vbi1Qcm9maXQgQ2VudGVycyIgPSAiYmx1ZSIsICJHb3Zlcm5tZW50IENlbnRlcnMiID0gInJlZCIpKSArCiAgbGFicyh5ID0gIlN1bSBUcmVhdG1lbnQgQ2VudGVycyBpbiA1MCBTdGF0ZXMgKyBEQyIsIHRpdGxlID0gIlRyZWF0bWVudCBDZW50ZXIgQ291bnRzIGJ5IFByb2ZpdCBTdGF0dXMgb3ZlciBUaW1lIikKYGBgCgoKCnVzaW5nIG1hcCB0dXRvcmlhbCBmcm9tOiBodHRwczovL2p0cjEzLmdpdGh1Yi5pby9jYzE5L2RpZmZlcmVudC13YXlzLW9mLXBsb3R0aW5nLXUtcy1tYXAtaW4tci5odG1sI3VzaW5nLWdncGxvdDItcGFja2FnZQpzdGF0ZSBhYmJyZXZpYXRpb25zIGZyb206IGh0dHBzOi8vd3d3LnNzYS5nb3YvaW50ZXJuYXRpb25hbC9jb2MtZG9jcy9zdGF0ZXMuaHRtbAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtYXBzKQpsaWJyYXJ5KG1hcGRhdGEpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHNmKQoKdXNhIDwtIG1hcF9kYXRhKCd1c2EnKQpzdGF0ZSA8LSBtYXBfZGF0YSgic3RhdGUiKQoKI21lcmdlIHN0YXRlIGdlbyBmaWxlIHRvIHRoZSBmb3ItcHJvZml0IGluZm9ybWF0aW9uCnN0YXRlIDwtIHN0YXRlICU+JSAKICAgICAgICAgICAgICBsZWZ0X2pvaW4oc3RhdGVfYWJicmV2c19kZiwgYnkgPSBjKCJyZWdpb24iID0gInN0YXRlX25hbWVzIikpICU+JSAKICAgICAgICAgICAgICBsZWZ0X2pvaW4ocHJvZml0X3N0YXRlc18xNDE5LCBieSA9IGMoJ3N0YXRlX2FiYnJldnMnID0gJ1NUQVRFJykpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApgYGAKCgoKCmBgYHtyfQojcGxvdCB0aGUgbnVtYmVyIG9mIGZvci1wcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgZnJvbSAyMDE1LTIwMTkKZm9yIChpIGluIHNlcSgyMDE1LCAyMDE5KSkKewogIHBsb3RfZm9ycHJvZml0cyA8LSBnZ3Bsb3QoZGF0YT1zdGF0ZSwgYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9ICEhc3ltKHBhc3RlMCgiY291bnRfRm9ycHJvZml0XyIsIGksIHNlcCA9ICIiKSksIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gImdyZWVuIiwgbGltaXRzID0gYygwLDgwMCkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKHBhc3RlKCcjIEZvci1Qcm9maXQgVHJlYXRtZW50IENlbnRlcnMgaW4nLCBpKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKICBwcmludChwbG90X2ZvcnByb2ZpdHMpCn0KCgpnZ3Bsb3QoZGF0YT1zdGF0ZSwgYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9IGNoYW5nZV9Gb3Jwcm9maXRfMTUxOSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAiZ3JlZW4iLCBsaW1pdHMgPSBjKDAsNDAwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUoJ0NoYW5nZSBpbiAjIEZvci1Qcm9maXQgVHJlYXRtZW50IENlbnRlcnMgZnJvbSAyMDE1IC0gMjAxOScpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCgpgYGAKCgpgYGB7cn0KZm9yIChpIGluIHNlcSgyMDE1LCAyMDE5KSkKewogIHBsb3Rfbm9ucHJvZml0cyA8LSBnZ3Bsb3QoZGF0YT1zdGF0ZSwgYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9ICEhc3ltKHBhc3RlMCgiY291bnRfTm9ucHJvZml0XyIsIGksIHNlcCA9ICIiKSksIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gImJsdWUiLCBsaW1pdHMgPSBjKDAsOTAwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUocGFzdGUoJyMgTm9uLVByb2ZpdCBUcmVhdG1lbnQgQ2VudGVycyBpbicsIGkpKSArIAogICAgICAgICAgICAgICAgICAgICAgY29vcmRfZml4ZWQoMS4zKQogIHByaW50KHBsb3Rfbm9ucHJvZml0cykKfQoKCmdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gY2hhbmdlX05vbnByb2ZpdF8xNTE5LCBncm91cD1ncm91cCkpICsgCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmV5IiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLDEwMCkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCdDaGFuZ2UgaW4gIyBOb24tUHJvZml0IFRyZWF0bWVudCBDZW50ZXJzIGZyb20gMjAxNSAtIDIwMTknKSArIAogICAgICAgICAgICAgICAgICAgICAgY29vcmRfZml4ZWQoMS4zKQpgYGAKCmBgYHtyfQpmb3IgKGkgaW4gc2VxKDIwMTUsIDIwMTkpKQp7CiAgcGxvdF9nb3Z0IDwtIGdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gISFzeW0ocGFzdGUwKCJjb3VudF9Hb3Zlcm5tZW50XyIsIGksIHNlcCA9ICIiKSksIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gInJlZCIsIGxpbWl0cyA9IGMoMCwyNTApKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvbHlnb24oY29sb3IgPSAid2hpdGUiKSArIAogICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZShwYXN0ZSgnIyBHb3Zlcm5tZW50IFRyZWF0bWVudCBDZW50ZXJzIGluJywgaSkpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCiAgcHJpbnQocGxvdF9nb3Z0KQp9CgoKCmdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gY2hhbmdlX0dvdmVybm1lbnRfMTUxOSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAicmVkIiwgbGltaXRzID0gYygwLDUwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUoJ0NoYW5nZSBpbiAjIEdvdmVybm1lbnQgVHJlYXRtZW50IENlbnRlcnMgZnJvbSAyMDE1IC0gMjAxOScpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCmBgYAoKCgpgYGB7cn0KCiMgc3RhdGVfbmFtZSA8LSAiQ2FsaWZvcm5pYSIKIyAKIyBwYXIobWFyPWMoNSwgNCwgNCwgMTIpLCB4cGQ9VFJVRSkKIyAKIyBwbG90KHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlVEUFlJTEFMIiwgXSRzdGFydF95ZWFyLCB5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJVRFBZSUxBTCIsIF0kZXN0X3RvdGFsLCB0eXBlID0gJ28nLCB5bGltPSBjKDAsMTAwMDApLCBtYWluID0gcGFzdGUoc3RhdGUsICJTdWJzdGFuY2UgVXNlIE1lYXN1cmVzIE92ZXIgVGltZSIpICx4bGFiID0gInllYXIiLCB5bGFiID0gIlRob3VzYW5kcyBvZiBQZW9wbGUgaW4gMjAxNS0xOCIpCiMgCiMgbGluZXMoeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiSUxMRU1NT04iLCBdJHN0YXJ0X3llYXIsIHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIklMTEVNTU9OIiwgXSRlc3RfdG90YWwsIGNvbCA9ICdibHVlJywgdHlwZSA9ICdvJykKIyAKIyBsaW5lcyh5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJCTkdEUksiLCBdJHN0YXJ0X3llYXIsIHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIkJOR0RSSyIsIF0kZXN0X3RvdGFsLCBjb2wgPSAncmVkJywgdHlwZSA9ICdvJykKIyAKIyBsaW5lcyh5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJUWE5QSUxBTCIsIF0kc3RhcnRfeWVhciwgeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiVFhOUElMQUwiLCBdJGVzdF90b3RhbCwgY29sID0gJ2dyZWVuJywgdHlwZSA9ICdvJykKIyAKIyBsaW5lcyh5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJQTlJOTVlSIiwgXSRzdGFydF95ZWFyLCB5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJQTlJOTVlSIiwgXSRlc3RfdG90YWwsIGNvbCA9ICdwdXJwbGUnLCB0eXBlID0gJ28nKQojIAojIGxlZ2VuZCgndG9wcmlnaHQnLGxlZ2VuZCA9IGMoIlN1YnN0YW5jZSBVc2UgRGlzb3JkZXIiLCAiRHJ1ZyB1c2UgaW4gcGFzdCBtb250aCIsICJCaW5nZSBhbGNvaG9sIHVzZSIsICJOZWVkaW5nLCBub3QgcmVjZWl2aW5nIHR4IiwgInBhaW4gcmVsaWV2ZXIgbWlzdXNlIiksIGNvbCA9IGMoImJsYWNrIiwgImJsdWUiLCAicmVkIiwgImdyZWVuIiwgInB1cnBsZSIpLCBsdHkgPSAxLCAgaW5zZXQ9YygtMC41LCAwKSkKCmBgYAoKCmBgYHtyfQoKcGxvdChzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiRm9ycHJvZml0IiwgXSRzdWQsIHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJGb3Jwcm9maXQiLF0kdHhfcGVyY2FwaXRhLCB4bGFiID0gIlN1YnN0YW5jZSBVc2UgRGlzb3JkZXIgQ291bnRzIChpbiB0aG91c2FuZHMpIiwgeWxhYiA9ICJGb3IgcHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEiKQphYmxpbmUobG0odHhfcGVyY2FwaXRhIH4gc3VkLCBkYXRhID0gc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIkZvcnByb2ZpdCIsIF0pKQoKCnBsb3Qoc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIk5vbnByb2ZpdCIsIF0kc3VkLCBzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiTm9ucHJvZml0IixdJHR4X3BlcmNhcGl0YSwgY29sID0gImJsdWUiLCB4bGFiID0gIlN1YnN0YW5jZSBVc2UgRGlzb3JkZXIgY291bnRzIChpbiB0aG91c2FuZHMpICIsIHlsYWIgPSAiTm9ucHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEiKQphYmxpbmUobG0odHhfcGVyY2FwaXRhIH4gc3VkLCBkYXRhID0gc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIk5vbnByb2ZpdCIsIF0pKQoKcGxvdChzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiR292ZXJubWVudCIsIF0kc3VkLCBzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiR292ZXJubWVudCIsXSR0eF9wZXJjYXBpdGEsIGNvbCA9ICJncmVlbiIsIHhsYWIgPSAiU3Vic3RhbmNlIFVzZSBEaXNvcmRlciBjb3VudHMgKGluIHRob3VzYW5kcykiLCB5bGFiID0gIkdvdmVybm1lbnQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YSIpCmFibGluZShsbSh0eF9wZXJjYXBpdGEgfiBzdWQsIGRhdGEgPSBzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiR292ZXJubWVudCIsIF0pKQoKCmBgYAoKCgpMb29rIGF0IHRoZSBkaXN0cmlidXRpb24gb2YgZWFjaCBpbnB1dCB2YXJpYWJsZSBvZiBpbnRlcmVzdCBhdCBlYWNoIHBvaW50IGluIHRpbWUKYGBge3J9CgpjcmVhdGVfaGlzdCA8LSBmdW5jdGlvbihkZiwgeWVhcl9wYXJhbSwgcHJvZml0X3BhcmFtLCBjb2xfcGFyYW0pCnsKICBzdWJzZXRfZGF0YSA8LSBkZiAlPiUKICBmaWx0ZXIoeWVhciA9PSB5ZWFyX3BhcmFtLCBwcm9maXRfdHlwZSA9PSBwcm9maXRfcGFyYW0pCiAgaGlzdChzdWJzZXRfZGF0YVtbY29sX3BhcmFtXV0sIG1haW4gPSBwYXN0ZSgiSGlzdG9ncmFtIG9mICIseWVhcl9wYXJhbSwgcHJvZml0X3BhcmFtLCBjb2xfcGFyYW0pLCB4bGFiID0gY29sX3BhcmFtKQp9CgpgYGAKCmBgYHtyfQoKI3N1YnN0YW5jZSB1c2UgbWVhc3VyZXMgYXJlIHJvdWdobHkgbm9ybWFsCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE2LCAiRm9ycHJvZml0IiwgImJpbmdlX2RyaW5raW5nIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTcsICJGb3Jwcm9maXQiLCAiYmluZ2VfZHJpbmtpbmciKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOCwgIkZvcnByb2ZpdCIsICJiaW5nZV9kcmlua2luZyIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE5LCAiRm9ycHJvZml0IiwgImJpbmdlX2RyaW5raW5nIikKCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE2LCAiRm9ycHJvZml0IiwgImlsbGljaXRfZHJ1Z3VzZSIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE3LCAiRm9ycHJvZml0IiwgImlsbGljaXRfZHJ1Z3VzZSIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE4LCAiRm9ycHJvZml0IiwgImlsbGljaXRfZHJ1Z3VzZSIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE5LCAiRm9ycHJvZml0IiwgImlsbGljaXRfZHJ1Z3VzZSIpCgpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNiwgIkZvcnByb2ZpdCIsICJuZWVkaW5nX3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTcsICJGb3Jwcm9maXQiLCAibmVlZGluZ190eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE4LCAiRm9ycHJvZml0IiwgIm5lZWRpbmdfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOSwgIkZvcnByb2ZpdCIsICJuZWVkaW5nX3R4IikKCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE2LCAiRm9ycHJvZml0IiwgInN1ZCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE3LCAiRm9ycHJvZml0IiwgInN1ZCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE4LCAiRm9ycHJvZml0IiwgInN1ZCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE5LCAiRm9ycHJvZml0IiwgInN1ZCIpCmBgYApgYGB7cn0KI2ZvciBwcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgYXJlIGhlYXZpbHkgc2tld2VkIGZvciBhbGwgeWVhcnMKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTYsICJGb3Jwcm9maXQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNywgIkZvcnByb2ZpdCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE4LCAiRm9ycHJvZml0IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTksICJGb3Jwcm9maXQiLCAiY291bnRfdHgiKQpgYGAKCmBgYHtyfQojbm9uIHByb2ZpdCB0cmVhdG1lbnQgY2VudGVycyBhcmUgaGVhdmlseSBza2V3ZWQgZm9yIGFsbCB5ZWFycwpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNiwgIk5vbnByb2ZpdCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE3LCAiTm9ucHJvZml0IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTgsICJOb25wcm9maXQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOSwgIk5vbnByb2ZpdCIsICJjb3VudF90eCIpCmBgYApgYGB7cn0KI2dvdmVybm1lbnQgdHJlYXRtZW50IGNlbnRlcnMgYXJlIGhlYXZpbHkgc2tld2VkIGZvciBhbGwgeWVhcnMKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTYsICJHb3Zlcm5tZW50IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTcsICJHb3Zlcm5tZW50IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTgsICJHb3Zlcm5tZW50IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTksICJHb3Zlcm5tZW50IiwgImNvdW50X3R4IikKYGBgCgoKCkludmVzdGlnYXRpbmcgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YSBvdmVyIHRpbWUgYW5kIGJ5IHByb2ZpdCBzdGF0dXMKYGBge3J9CmZvcnByb2ZpdF90eHBlcmNhcGl0YSA8LSBzdGF0ZV9maW5hbF9kZiAlPiUgCiAgZmlsdGVyKHByb2ZpdF90eXBlID09ICJGb3Jwcm9maXQiKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXplKGF2Z190eF9wZXJjYXBpdGEgPSBtZWFuKHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWluX3R4X3BlcmNhcGl0YSA9IG1pbih0eF9wZXJjYXBpdGEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1heF90eF9wZXJjYXBpdGEgPSBtYXgodHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpKQogIApub25wcm9maXRfdHhwZXJjYXBpdGEgPC0gc3RhdGVfZmluYWxfZGYgJT4lIAogIGZpbHRlcihwcm9maXRfdHlwZSA9PSAiTm9ucHJvZml0IikgJT4lIAogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcml6ZShhdmdfdHhfcGVyY2FwaXRhID0gbWVhbih0eF9wZXJjYXBpdGEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1pbl90eF9wZXJjYXBpdGEgPSBtaW4odHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtYXhfdHhfcGVyY2FwaXRhID0gbWF4KHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSkKCmdvdnRfdHhwZXJjYXBpdGEgPC0gc3RhdGVfZmluYWxfZGYgJT4lIAogIGZpbHRlcihwcm9maXRfdHlwZSA9PSAiR292ZXJubWVudCIpICU+JSAKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpemUoYXZnX3R4X3BlcmNhcGl0YSA9IG1lYW4odHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtaW5fdHhfcGVyY2FwaXRhID0gbWluKHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWF4X3R4X3BlcmNhcGl0YSA9IG1heCh0eF9wZXJjYXBpdGEsIG5hLnJtID0gVFJVRSkpCgoKCnBsb3QoZm9ycHJvZml0X3R4cGVyY2FwaXRhJHllYXIsIGZvcnByb2ZpdF90eHBlcmNhcGl0YSRhdmdfdHhfcGVyY2FwaXRhLCB0eXBlID0gJ28nLCBjb2wgPSAnYmx1ZScsIHlsaW0gPSBjKDAuMDAwMDAxLCAwLjAwMDA1KSkKI2xpbmVzKGZvcnByb2ZpdF90eHBlcmNhcGl0YSR5ZWFyLCBmb3Jwcm9maXRfdHhwZXJjYXBpdGEkbWluX3R4X3BlcmNhcGl0YSwgdHlwZSA9ICdsJywgY29sID0gJ2JsdWUnLCBsdHkgPSAyKQojbGluZXMoZm9ycHJvZml0X3R4cGVyY2FwaXRhJHllYXIsIGZvcnByb2ZpdF90eHBlcmNhcGl0YSRtYXhfdHhfcGVyY2FwaXRhLCB0eXBlID0gJ2wnLCBjb2wgPSAnYmx1ZScsIGx0eSA9IDIpCgpsaW5lcyhub25wcm9maXRfdHhwZXJjYXBpdGEkeWVhciwgbm9ucHJvZml0X3R4cGVyY2FwaXRhJGF2Z190eF9wZXJjYXBpdGEsIHR5cGUgPSAnbycsIGNvbCA9ICdyZWQnICkKI2xpbmVzKG5vbnByb2ZpdF90eHBlcmNhcGl0YSR5ZWFyLCBub25wcm9maXRfdHhwZXJjYXBpdGEkbWluX3R4X3BlcmNhcGl0YSwgdHlwZSA9ICdsJywgY29sID0gJ3JlZCcsIGx0eSA9IDIgKQojbGluZXMobm9ucHJvZml0X3R4cGVyY2FwaXRhJHllYXIsIG5vbnByb2ZpdF90eHBlcmNhcGl0YSRtYXhfdHhfcGVyY2FwaXRhLCB0eXBlID0gJ2wnLCBjb2wgPSAncmVkJywgbHR5ID0gMiApCgpsaW5lcyhnb3Z0X3R4cGVyY2FwaXRhJHllYXIsIGdvdnRfdHhwZXJjYXBpdGEkYXZnX3R4X3BlcmNhcGl0YSwgdHlwZSA9ICdvJywgY29sID0gJ2dyZWVuJykKI2xpbmVzKGdvdnRfdHhwZXJjYXBpdGEkeWVhciwgZ292dF90eHBlcmNhcGl0YSRtaW5fdHhfcGVyY2FwaXRhLCB0eXBlID0gJ2wnLCBjb2wgPSAnZ3JlZW4nLCBsdHkgPSAyKQojbGluZXMoZ292dF90eHBlcmNhcGl0YSR5ZWFyLCBnb3Z0X3R4cGVyY2FwaXRhJG1heF90eF9wZXJjYXBpdGEsIHR5cGUgPSAnbCcsIGNvbCA9ICdncmVlbicsIGx0eSA9IDIpCgoKYGBgCmBgYHtyfQpzdGF0ZV9maW5hbF9kZltpcy5uYShzdGF0ZV9maW5hbF9kZiR0eF9wZXJjYXBpdGEpLF0KYGBgCgpgYGB7cn0KI0Nvbm5lY3RpY3V0LCBTb3V0aCBDYXJvbGluYSwgT2hpbywgTWlzc2lzc2lwcGksIE5ldyBZb3JrIGhhdmUgdGhlIGZld2VzdCBmb3ItcHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEKI01haW5lLCBJZGFobywgVXRhaCwgTm9ydGggRGFrb3RhLCBLZW50dWNreSBoYXZlIHRoZSBtb3N0IGZvci1wcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgcGVyIGNhcGl0YSAKc3RhdGVfZmluYWxfZGYgJT4lCiAgZ3JvdXBfYnkoU3RhdGVfQWJicmV2LCBwcm9maXRfdHlwZSkgJT4lCiAgc3VtbWFyaXplKGF2Z190eHBlcmNhcGl0YSA9IG1lYW4odHhfcGVyY2FwaXRhLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBmaWx0ZXIocHJvZml0X3R5cGUgPT0gIkZvcnByb2ZpdCIpICU+JQogIGFycmFuZ2UoYXZnX3R4cGVyY2FwaXRhKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbGVmdF9qb2luKHN0YXRlLCBieSA9IGMoIlN0YXRlX0FiYnJldiIgPSAic3RhdGVfYWJicmV2cyIpKSAlPiUKZ2dwbG90KGFlcyh4PWxvbmcsIHk9bGF0LCBmaWxsPSBhdmdfdHhwZXJjYXBpdGEsIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gImdyZWVuIiwgbGltaXRzID0gYygwLDAuMDAwMSkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCdBdmVyYWdlIE5vbnByb2ZpdCBUcmVhdG1lbnQgQ2VudGVycyBwZXIgY2FwaXRhIDIwMTUtMjAxOScpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCmBgYAoKYGBge3J9CiNWaXJnaW5pYSwgVGV4YXMsIElkYWhvLCBTb3V0aCBDYXJvbGluYSwgR2VvcmdpYSBoYXZlIHRoZSBmZXdlc3Qgbm9uLXByb2ZpdCB0cmVhdG1lbnQgY2VudGVycyBwZXIgY2FwaXRhCiNIYXdhaWksIEFsYXNrYSwgTWFpbmUsIFZlcm1vbnQsIFd5b21pbmcgaGF2ZSB0aGUgbW9zdCBub24tcHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEgCnN0YXRlX2ZpbmFsX2RmICU+JQogIGdyb3VwX2J5KFN0YXRlX0FiYnJldiwgcHJvZml0X3R5cGUpICU+JQogIHN1bW1hcml6ZShhdmdfdHhwZXJjYXBpdGEgPSBtZWFuKHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZmlsdGVyKHByb2ZpdF90eXBlID09ICJOb25wcm9maXQiKSAlPiUKICBhcnJhbmdlKGF2Z190eHBlcmNhcGl0YSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGxlZnRfam9pbihzdGF0ZSwgYnkgPSBjKCJTdGF0ZV9BYmJyZXYiID0gInN0YXRlX2FiYnJldnMiKSkgJT4lCmdncGxvdChhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gYXZnX3R4cGVyY2FwaXRhLCBncm91cD1ncm91cCkpICsgCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmV5IiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLDAuMDAwMSkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCdBdmVyYWdlIE5vbnByb2ZpdCBUcmVhdG1lbnQgQ2VudGVycyBwZXIgY2FwaXRhIDIwMTUtMjAxOScpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCmBgYAoKYGBge3J9CiNOZXcgSGFtcHNoaXJlLCBUZW5uZXNzZWUsIFBlbm5zeWx2YW5pYSwgRGVsYXdhcmUsIEtlbnR1Y2t5IGhhdmUgdGhlIGZld2VzdCBnb3Zlcm5tZW50IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEKI0FsYXNrYSwgTm9ydGggRGFrb3RhLCBTb3V0aCBEYWtvdGEsIFd5b21pbmcsIE5ldyBNZXhpY28gaGF2ZSB0aGUgbW9zdCBnb3Zlcm5tZW50IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEgCnN0YXRlX2ZpbmFsX2RmICU+JQogIGdyb3VwX2J5KFN0YXRlX0FiYnJldiwgcHJvZml0X3R5cGUpICU+JQogIHN1bW1hcml6ZShhdmdfdHhwZXJjYXBpdGEgPSBtZWFuKHR4X3BlcmNhcGl0YSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZmlsdGVyKHByb2ZpdF90eXBlID09ICJHb3Zlcm5tZW50IikgJT4lCiAgYXJyYW5nZShhdmdfdHhwZXJjYXBpdGEpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBsZWZ0X2pvaW4oc3RhdGUsIGJ5ID0gYygiU3RhdGVfQWJicmV2IiA9ICJzdGF0ZV9hYmJyZXZzIikpICU+JQpnZ3Bsb3QoYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9IGF2Z190eHBlcmNhcGl0YSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAicmVkIiwgbGltaXRzID0gYygwLDAuMDAwMDUpKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvbHlnb24oY29sb3IgPSAid2hpdGUiKSArIAogICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZSgnQXZlcmFnZSBnb3Zlcm5tZW50IFRyZWF0bWVudCBDZW50ZXJzIHBlciBjYXBpdGEgMjAxNS0yMDE5JykgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKYGBgCgpDcmVhdGUgYSBjc3Ygd2l0aCB0aGUgYXZlcmFnZXMgcGVyIHN0YXRlIGJldHdlZW4gMjAxNSAtIDIwMTkgYW5kIHdyaXRlIHRvIGNzdiAKYGBge3J9CnN0YXRlX2ZpbmFsX2RmICU+JQogIGZpbHRlcih5ZWFyID49IDIwMTUpICU+JSAjbW9kZWwgd2lsbCBvbmx5IHVzZSAyMDE1IC0gMjAxOQogIGdyb3VwX2J5KFN0YXRlX05hbWUsIHllYXIpICU+JQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBjKFN0YXRlX05hbWUsIHllYXIpLCBuYW1lc19mcm9tID0gcHJvZml0X3R5cGUsIHZhbHVlc19mcm9tID0gY291bnRfdHgpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKHllYXIpICU+JQogIGdyb3VwX2J5KFN0YXRlX05hbWUpICU+JQogIHN1bW1hcml6ZShGb3Jwcm9maXRfQ291bnQyMDE1ID0gZmlyc3QoRm9ycHJvZml0KSwKICAgICAgICAgICAgRm9ycHJvZml0X0NoYW5nZTE1MTkgPSBsYXN0KEZvcnByb2ZpdCkgLSBmaXJzdChGb3Jwcm9maXQpLAogICAgICAgICAgICBOb25wcm9maXRfQ291bnQyMDE1ID0gZmlyc3QoTm9ucHJvZml0KSwKICAgICAgICAgICAgTm9ucHJvZml0X0NoYW5nZTE1MTkgPSBsYXN0KE5vbnByb2ZpdCkgLSBmaXJzdChOb25wcm9maXQpLAogICAgICAgICAgICBHb3Zlcm5tZW50X0NvdW50MjAxNSA9IGZpcnN0KEdvdmVybm1lbnQpLCAKICAgICAgICAgICAgR292ZXJubWVudF9DaGFuZ2UxNTE5ID0gbGFzdChHb3Zlcm5tZW50KSAtIGZpcnN0KEdvdmVybm1lbnQpCikgJT4lCiAgYXJyYW5nZShkZXNjKEZvcnByb2ZpdF9DaGFuZ2UxNTE5KSkgJT4lCiAgd3JpdGUuY3N2KCJTdGF0ZV9Qcm9maXRfQ291bnRzLmNzdiIpCiAgI211dGF0ZShpbmNyZWFzZSA9IGlmZWxzZSgpKQpgYGAKCkNyZWF0ZSBhIGNzdiBvZiB0aGUgZHJ1ZyB1c2UgYnkgc3RhdGUgCmBgYHtyfQpzdGF0ZV9maW5hbF9kZiAlPiUKICBmaWx0ZXIoeWVhciA+PSAyMDE1KSAlPiUgI21vZGVsIHdpbGwgb25seSB1c2UgMjAxNSAtIDIwMTkKICBncm91cF9ieShTdGF0ZV9OYW1lKSAlPiUKICBhcnJhbmdlKHllYXIpICU+JQogICBzdW1tYXJpemUoRHJ1Z3VzZTIwMTNfMTQgPSBmaXJzdChwcmV2MnllYXJzX2RydWd1c2VjYWxjKSwKICAgICAgICAgICAgIENvY2FpbmUyMDEzXzE0ID0gZmlyc3QocHJldjJ5ZWFyc19jb2NhaW5lKSwKICAgICAgICAgICAgIEhlcm9pbjIwMTNfMTQgPSBmaXJzdChwcmV2MnllYXJzX2hlcm9pbiksCiAgICAgICAgICAgICBBVUQyMDEzXzE0ID0gZmlyc3QocHJldjJ5ZWFyc19hdWQpLAogICAgICAgICAgICAgTWFyaWp1YW5hMjAxM18xNCA9IGZpcnN0KHByZXYyeWVhcnNfbWFyaWp1YW5hKSklPiUKIyAgICAgICAgICAgICBGb3Jwcm9maXRfQ2hhbmdlMTUxOSA9IGxhc3QoRm9ycHJvZml0KSAtIGZpcnN0KEZvcnByb2ZpdCksCiMgICAgICAgICAgICAgTm9ucHJvZml0X0NvdW50MjAxNSA9IGZpcnN0KE5vbnByb2ZpdCksCiMgICAgICAgICAgICAgTm9ucHJvZml0X0NoYW5nZTE1MTkgPSBsYXN0KE5vbnByb2ZpdCkgLSBmaXJzdChOb25wcm9maXQpLAojICAgICAgICAgICAgIEdvdmVybm1lbnRfQ291bnQyMDE1ID0gZmlyc3QoR292ZXJubWVudCksIAojICAgICAgICAgICAgIEdvdmVybm1lbnRfQ2hhbmdlMTUxOSA9IGxhc3QoR292ZXJubWVudCkgLSBmaXJzdChHb3Zlcm5tZW50KQogICBhcnJhbmdlKGRlc2MoRHJ1Z3VzZTIwMTNfMTQpKSAlPiUKICAgIHdyaXRlLmNzdigiU3RhdGVfRHJ1Z3VzZV9Db3VudHMuY3N2IikKCmBgYAoKCgpgYGB7cn0KCnN0YXRlX3llYXJseV9hdmVyYWdlczwtIHN0YXRlX2ZpbmFsX2RmICU+JQogIGRpc3RpbmN0KFN0YXRlX0FiYnJldiwgcHJvZml0X3R5cGUsIHllYXIsIC5rZWVwX2FsbCA9IFRSVUUpICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcml6ZShhdmdfZHJ1Z3VzZSA9IG1lYW4oaWxsaWNpdF9kcnVndXNlKSwKICAgICAgICAgYXZnX2RyaW5raW5nID0gbWVhbihiaW5nZV9kcmlua2luZyksCiAgICAgICAgIGF2Z19vZCA9IG1lYW4oUkFURSkpICU+JQogIGFycmFuZ2UoeWVhcikKCnBsb3Qoc3RhdGVfeWVhcmx5X2F2ZXJhZ2VzJHllYXIsIHN0YXRlX3llYXJseV9hdmVyYWdlcyRhdmdfZHJ1Z3VzZSwgdHlwZSA9ICdsJykKcGxvdChzdGF0ZV95ZWFybHlfYXZlcmFnZXMkeWVhciwgc3RhdGVfeWVhcmx5X2F2ZXJhZ2VzJGF2Z19kcmlua2luZywgdHlwZSA9ICdsJykKcGxvdChzdGF0ZV95ZWFybHlfYXZlcmFnZXMkYXZnX29kLCBzdGF0ZV95ZWFybHlfYXZlcmFnZXMkYXZnX29kLCB0eXBlID0gJ2wnKQoKYGBgCmBgYHtyfQpzdGF0ZV9maW5hbF9kZiAlPiUKICBzZWxlY3QoU3RhdGVfTmFtZSwgcHJvZml0X3R5cGUsIHllYXIsIGNvdW50X3R4LCBjb2NhaW5lX3lyLCBtYXJpanVhbmFfbW9udGgsIGF1ZF95ciwgaGVyb2luX3lyLCBkcnVndXNlX2NhbGMpICU+JQogICNncm91cF9ieShTdGF0ZV9OYW1lLCBwcm9maXRfdHlwZSkgIyU+JQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBjKFN0YXRlX05hbWUsIHByb2ZpdF90eXBlKSwgbmFtZXNfZnJvbSA9IHllYXIsIHZhbHVlc19mcm9tID0gY291bnRfdHgsIHVudXNlZF9mbiA9IGZpcnN0KSAjJT4lCiAgI211dGF0ZShhdmVyYWdlXzE0MTkgPSBtZWFuKHNlbGVjdCgiMjAxNCIsICIyMDE1IiwgIjIwMTYiLCAiMjAxNyIsICIyMDE4IiwgIjIwMTkiKSkpIyU+JQogICNwaXZvdF93aWRlcihpZF9jb2xzID0gYyhTdGF0ZV9OYW1lLCB5ZWFyKSwgbmFtZXNfZnJvbSA9IHByb2ZpdF90eXBlLCB2YWx1ZXNfZnJvbSA9IGNvdW50X3R4LCB1bnVzZWRfZm4gPSBmaXJzdCkgIyU+JQogICNwaXZvdF93aWRlcihpZF9jb2xzID0gYyhTdGF0ZV9OYW1lKSwgbmFtZXNfZnJvbSA9IHByb2ZpdF90eXBlLCB2YWx1ZXNfZnJvbT1jKCIyMDE0IiwgIjIwMTUiLCAiMjAxNiIsICIyMDE3IiwgIjIwMTgiLCAiMjAxOSIpLCB1bnVzZWRfZm4gPSBmaXJzdCkKCmBgYApgYGB7cn0KcHJpbnQoIlRlc3QiKQpgYGAKCg==